/**
 * @file JugadorBD.java
 * Archivo que contiene la clase JugadorBD.java
 * 
 * @author Carlos Rabelo
 * @version 1.2
 */

package GestorJugadores;

import ConexionBD.ConexionBD;
import GestorCuota.CuotaBD;
import GestorPago.PagoBD;
import java.sql.ResultSet;
import java.sql.SQLException;
import sun.util.calendar.CalendarDate;


/**
 * Clase intermedia entre ConexionBD y ControladorJugador
 * 
 * Esta clase hace de traductor entre objetos Jugador y consultas SQL
 * para hacer posible la comunicación entre ControladorJugador y la BD
 * Se implementa siguiendo el patrón de Diseño "Singleton"
 * 
 * @author Carlos Rabelo
 * @version 1.2
 */
public class JugadorBD {

    private static JugadorBD Instancia=null;
    
    /**
     * Constructor por defecto. Al ser un singleton el contructor es privado
     * @param void
     * @return void
     */
    private JugadorBD(){}

    
    /**
     * Método que devuelve la única instancia de la clase
     * @param void
     * @return Instancia
     */
    public static JugadorBD getInstancia() {
        if (Instancia==null){
            Instancia = new JugadorBD();
        }
        return Instancia;
    }

    @Override
    /**
     * Sobrecarga del método clone para impedir que se duplique la instancia
     * (Exigencias del patrón Singleton)
     * @param void
     * @return Object
     */
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException(); 
    }
    

    /**
     * Método que añade un objeto Jugador a la Base de Datos
     * Si se pretende modificar un Jugador existente en la Base de Datos
     * utilizar el método updateJugador
     * @param jug Objeto Jugador a añadir
     * @return El objeto Jugador con el atributo jugadorId actualizado si
     * acabó con éxito o null si hubo algún error
     * @author Carlos Rabelo
     */
    public Jugador addJugador(Jugador jug) {
        java.sql.Date nacimiento=new java.sql.Date(jug.getNacimiento().getTime());

        String consulta="INSERT INTO Jugador(Nombre,Apellidos,Sexo,Nacimiento," +
            "Talla,Tutor,Correo,NumCuenta,Telefono,Observaciones,FormaPago,Estado) VALUES ('" +
            jug.getNombre() +
            "','" + jug.getApellidos() +
            "','" + jug.getSexo() +
            "','" + nacimiento.toString() +
            "','" + jug.getTalla() +
            "','" + jug.getTutor() +
            "','" + jug.getCorreo() +
            "','" + jug.getNumCuenta() +
            "','" + jug.getTelefono().toString() +
            "','" + jug.getObservaciones().toString() +
            "','" + jug.getFormaPago() +    
            "','";
        if (jug.getEstado()) {
            consulta+="activo');";
        } else {
            consulta+="baja');";
        }

        try {
            ConexionBD.getInstancia().conectar();
            ResultSet salidaBD=ConexionBD.getInstancia().actualizar(consulta);
            salidaBD.first();
            // Establece el valor de IdJugador generado por la BD en el objeto jug
            jug.setIdJugador(Integer.parseInt(salidaBD.getString(1)));
            ConexionBD.getInstancia().desconectar();
        } catch (SQLException ex) {
            return null;
        }
        
        return jug;
    }
    

    /**
     * Método que elimina un objeto Jugador de la Base de Datos
     * El Jugador en realidad no es eliminado sino que se le cambia
     * el atributo estado a 'baja' pero se mantiene en la Base de Datos
     * @param idJugador el identificador único del Jugador en la BD
     * @return true si se modificó con éxito false si no
     * @author Carlos Rabelo
     */
    public Boolean deleteJugador(Integer idJugador) {
        try {
            // Hacer comprobaciones si necesario
            ConexionBD.getInstancia().conectar();
            String consulta="UPDATE Jugador SET Estado='baja' WHERE idJugador=" + idJugador.toString() + ";";        
            ConexionBD.getInstancia().actualizar(consulta);
            ConexionBD.getInstancia().desconectar();
            
        } catch (SQLException ex) {
            return false;
        }
        return true;
    }
   
    
    
    public Jugador getJugador(int idJugador){
        String consulta="SELECT * FROM Jugador WHERE "+
                        " idJugador  = '" + idJugador + "'"+
                        ";";
        Jugador listajug = null;
        try {
            ConexionBD.getInstancia().conectar();
            ResultSet tabla = ConexionBD.getInstancia().consultar(consulta);

            if (tabla.last()) { // Si devuelve false es que la búsqueda es vacía
                int nfilas=tabla.getRow();
                tabla.beforeFirst(); // Volvemos al principio
                //listajug=new Jugador;
                Boolean estado;
                for (int i=0; i<nfilas; i++){    
                    tabla.next();
                    estado = true;
                    if (tabla.getString("Estado").equals("baja")) {
                        estado = false;
                    }
                    listajug = new Jugador(tabla.getString("Nombre"), tabla.getString("Apellidos"),
                            tabla.getString("Sexo").charAt(0), tabla.getDate("Nacimiento"),
                            tabla.getString("Talla"), tabla.getString("Tutor"), tabla.getString("Correo"),
                            tabla.getString("NumCuenta"), tabla.getInt("Telefono"),
                            tabla.getString("Observaciones"),
                            tabla.getString("FormaPago").charAt(0),
                            estado);
                    listajug.setIdJugador(idJugador);
                }
            }
            ConexionBD.getInstancia().desconectar();
        } catch (SQLException ex) {
            return null;
        }
        return listajug;
    }
    
    
    
    
    /**
     * Método que hace una consulta en la tabla Jugador de la Base de Datos
     * y devuelve un vector de Jugadores que cumplen los parámetros de búsqueda
     * @param nombre_jug Nombre del jugador  
     * @param apellidos_jug Apellidos del jugador
     * @return Vector de objetos Jugador cumpliendo los parámetros de búsqueda
     * si lo hubiera o null en caso de error o si la consulta no ha dado
     * resultados
     */
    public Jugador[] getJugador(String nombre_jug, String apellidos_jug)  {
        // Solo se implementa la búsqueda por nombre y apellidos que es lo especificado en el diagrama de secuencia correspondiente
        String consulta="SELECT * FROM Jugador WHERE Jugador.Nombre LIKE '" + nombre_jug + "%' AND Jugador.Apellidos LIKE '" + apellidos_jug + "%';";
        Jugador[] listajug=null;
        try {
            ConexionBD.getInstancia().conectar();
            ResultSet tabla = ConexionBD.getInstancia().consultar(consulta);

            if (tabla.last()) { // Si devuelve false es que la búsqueda es vacía
                int nfilas=tabla.getRow();
                tabla.beforeFirst(); // Volvemos al principio
                listajug=new Jugador[nfilas];
                Boolean estado;
                for (int i=0; i<nfilas; i++){    
                    tabla.next();
                    estado = true;
                    if (tabla.getString("Estado").equals("baja")) {
                        estado = false;
                    }
                    listajug[i] = new Jugador(tabla.getString("Nombre"), tabla.getString("Apellidos"),
                            tabla.getString("Sexo").charAt(0), tabla.getDate("Nacimiento"),
                            tabla.getString("Talla"), tabla.getString("Tutor"), tabla.getString("Correo"),
                            tabla.getString("NumCuenta"), tabla.getInt("Telefono"),
                            tabla.getString("Observaciones"),
                            tabla.getString("FormaPago").charAt(0),
                            estado);
                    listajug[i].setIdJugador(tabla.getInt("IdJugador"));
                }
            }
            ConexionBD.getInstancia().desconectar();
        } catch (SQLException ex) {
            return null;
        }
        return listajug;
    }
    

    /**
     * Método que modifica un objeto Jugador de la Base de Datos
     * El Jugador debe estar en la Base de Datos previamente
     * El objeto a modificar se reconoce por el atributo idJugador y
     * se actualizan los valores de los parámetros a los que tiene
     * el objeto Jugador
     * @param idJugador el identificador único del Jugador en la BD
     * @return true si se modificó con éxito false si no
     * @author Carlos Rabelo
     */
    /**
     * Método que debe modificar un jugador pero que no se puede implementar
     * porque no se puede identificar al jugador de forma unívoca
     * @param nombre_jug Nombre del jugador  
     * @param apellidos_jug Apellidos del jugador
     * @param sexo_jug Sexo del jugador
     * @param nacimiento_jug Fecha de nacimiento del jugador
     * @param talla_jug Talla del jugador
     * @param tutor_jug Nombre del tutor del jugador
     * @param correo_jug Correo electrónico del jugador
     * @param num_cuenta_jug  Número de cuenta del jugador
     * @param tlf_jug Teléfono del jugador
     * @param estado_jug Estado (activo o baja) del jugador
     * @return true si se modificó con éxito false en caso contrario
     */
    
    public Boolean updateJugador(Jugador jug) {
           
        Boolean salida=true;
        
        // Hacer comprobaciones si necesario
        
        java.sql.Date nacimiento=new java.sql.Date(jug.getNacimiento().getTime());

        String consulta="UPDATE Jugador SET Nombre='" + jug.getNombre() + 
                "', Apellidos='" + jug.getApellidos() + 
                "', Sexo='" + jug.getSexo() +
                "', Nacimiento='" + nacimiento.toString() +
                "', Talla='" + jug.getTalla() +
                "', Tutor='" + jug.getTutor() +
                "', Correo='" + jug.getCorreo() +
                "', NumCuenta='" + jug.getNumCuenta() +
                "', Telefono='" + jug.getTelefono().toString() +
                "', Observaciones='" + jug.getObservaciones().toString() +
                "', FormaPago='" +jug.getFormaPago()+
                "', Estado='"
                ;
            
        if (jug.getEstado()) {
            consulta+="activo";
        } else {
            consulta+="baja";
        }
        consulta+="' WHERE idJugador=" + jug.getIdJugador().toString() + ";";
        
        try {
            ConexionBD.getInstancia().conectar();
            ConexionBD.getInstancia().actualizar(consulta);
            ConexionBD.getInstancia().desconectar();
        } catch (SQLException ex) {
            System.out.println(ex);
            salida=false;
        }
        return salida;
    }
    
    
    
    
    
    
    
    public Integer [] getListaJugadores(){
    // Solo se implementa la búsqueda por nombre y apellidos que es lo especificado en el diagrama de secuencia correspondiente
        String consulta="SELECT idJugador FROM Jugador ';";
        Integer [] listajug=null;
        try {
            ConexionBD.getInstancia().conectar();
            ResultSet tabla = ConexionBD.getInstancia().consultar(consulta);

            if (tabla.last()) { // Si devuelve false es que la búsqueda es vacía
                int nfilas=tabla.getRow();
                tabla.beforeFirst(); // Volvemos al principio
                listajug=new Integer[nfilas];
                Boolean estado;
                for (int i=0; i<nfilas; i++){    
                    tabla.next();
                    listajug[i] = new Integer(tabla.getInt(i));
                }
            }
            ConexionBD.getInstancia().desconectar();
        } catch (SQLException ex) {
            return null;
        }
        return  listajug;
    }
}
